import UnitUtil from "@/UnitUtil";
import 事件系统 from "./事件系统";

export default class 护盾系统 {
  static 配置: Map<unit, Map<string, number>> = new Map();
  constructor() {
    se.onUnitDeath((ev) => {
      if (!UnitUtil.isHero(ev.trigUnit)) {
        护盾系统.配置.delete(ev.trigUnit);
      }
    });
    事件系统.受到伤害(this.护盾处理);
  }
  护盾处理(数据: 伤害事件数据) {
    let 护盾值 = 护盾系统.获取总护盾值(数据.受伤目标);
    if (护盾值 > 0) {
      let 护盾数据 = 护盾系统.配置.get(数据.受伤目标);
      if (护盾数据 != null) {
        for (let item of 护盾数据) {
          let [key, value] = item;
          if (数据.最终伤害 < value) {
            护盾数据.set(key, value - 数据.最终伤害);
            数据.最终伤害 = 0;
            break;
          } else {
            数据.最终伤害 -= value;
            护盾数据.delete(key);
          }
        }
      }
    }
  }
  static 获取总护盾值(目标: unit): number {
    let map = 护盾系统.配置.get(目标);
    if (map != null) {
      let v = map.values();
      let total = 0;
      for (let val of v) {
        total += val;
      }
      return total;
    } else {
      return 0;
    }
  }
  static 获取按指定技能护盾值(目标: unit, 护盾技能id: string): number | null {
    let map = 护盾系统.配置.get(目标);
    if (map != null) {
      return map.get(护盾技能id) ?? 0;
    } else {
      return null;
    }
  }
  static 添加护盾值(目标: unit, 技能id: string, 数值: number, 叠加: boolean) {
    if (护盾系统.配置.get(目标) == null) {
      护盾系统.配置.set(目标, new Map<string, number>());
    }
    if (叠加) {
      let map = 护盾系统.配置.get(目标);
      let 剩余 = 0;
      if (map != null) {
        剩余 = map.get(技能id) ?? 0;
      }
      护盾系统.配置.get(目标).set(技能id, 剩余 + 数值);
    } else {
      护盾系统.配置.get(目标).set(技能id, 数值);
    }
  }
  static 移除指定技能护盾(目标: unit, 技能id: string) {
    let s = 护盾系统.配置.get(目标);
    s?.delete(技能id);
  }
}
